﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Processing.Structures
{
    /// <summary>
    /// Modelliert einen OpenCL Int4
    /// </summary>
    [Serializable]
    [StructLayout(LayoutKind.Sequential)]
    public struct Int4
    {
        #region Attribute
        /// <summary>
        /// Gibt und setzt den Wert von s0.
        /// </summary>
        public int s0;

        /// <summary>
        /// Gibt und setzt den Wert von s1.
        /// </summary>
        public int s1;

        /// <summary>
        /// Gibt und setzt den Wert von s2.
        /// </summary>
        public int s2;

        /// <summary>
        /// Gibt und setzt den Wert von s3.
        /// </summary>
        public int s3;
        #endregion Attribute

        #region Eigenschaften
        /// <summary>
        /// Gibt und setzt den Wert von x bzw. s0.
        /// </summary>
        public int x { get { return s0; } set { s0 = value; } }

        /// <summary>
        /// Gibt und setzt den Wert von y bzw. s1.
        /// </summary>
        public int y { get { return s1; } set { s1 = value; } }

        /// <summary>
        /// Gibt und setzt den Wert von z bzw. s2.
        /// </summary>
        public int z { get { return s2; } set { s2 = value; } }

        /// <summary>
        /// Gibt und setzt den Wert von w bzw. s3.
        /// </summary>
        public int w { get { return s3; } set { s3 = value; } }
        #endregion Eigenschaften

        #region Methoden
        /// <summary>
        /// Initialisiert die Struktur mit Werten.
        /// </summary>
        /// <param name="x">Der Wert für x.</param>
        /// <param name="y">Der Wert für y.</param>
        /// <param name="z">Der Wert für z.</param>
        /// <param name="w">Der Wert für w.</param>
        public Int4(int x, int y, int z, int w)
        {
            this.s0 = x;
            this.s1 = y;
            this.s2 = z;
            this.s3 = w;
        }

        /// <summary>
        /// Gibt eine Zeichenkettenrepräsentation der Struktur zurück.
        /// </summary>
        /// <returns>Die Zeichenkette.</returns>
        public override string ToString()
        {
            return "x: " + s0.ToString() +
                   " y: " + s1.ToString() +
                   " z: " + s2.ToString() +
                   " w: " + s3.ToString();
        }
        #endregion Methoden
    }
}
